home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 501-525 / disk_503 / pcq / pcq12asc.lzh / Runtime / PCQ / StringLib.asm < prev    next >
Assembly Source File  |  1991-04-01  |  10KB  |  460 lines

  1. *
  2. *       Strings.asm of PCQ Pascal
  3. *       Copyright 1989 Patrick Quaid
  4. *
  5. * Since PCQ strings are similar to C strings, these
  6. *       routines are similar in operation and name to the
  7. *       standard C stuff.
  8. *
  9.  
  10.         XREF    _p%new
  11.         XREF    _p%dispose
  12.  
  13.         SECTION StringLib,CODE
  14.  
  15.         XDEF    _isupper
  16. _isupper
  17.         move.w  4(sp),d0
  18. isup_   cmp.b   #'A',d0
  19.         blt.s   1$
  20.         cmp.b   #'Z',d0
  21.         bgt.s   1$
  22.         moveq   #-1,d0
  23.         rts
  24. 1$
  25.         moveq   #0,d0
  26.         rts
  27.  
  28.         XDEF    _islower
  29. _islower
  30.         move.w  4(sp),d0
  31. islo_   cmp.b   #'a',d0
  32.         blt.s   1$
  33.         cmp.b   #'z',d0
  34.         bgt.s   1$
  35.         moveq   #-1,d0
  36.         rts
  37. 1$
  38.         moveq   #0,d0
  39.         rts
  40.  
  41.         XDEF    _isalnum
  42. _isalnum
  43.         move.w  4(sp),d1
  44.         cmp.b   #'0',d1
  45.         blt.s   notalfa
  46.         cmp.b   #'9',d1
  47.         ble.s   isalfa
  48.         bra.s   inalfa
  49.  
  50.         XDEF    _isalpha
  51. _isalpha
  52.         move.w  4(sp),d1
  53. inalfa  cmpi.b  #'A',d1
  54.         blt.s   notalfa
  55.         cmpi.b  #'Z',d1
  56.         bgt.s   maybealfa
  57. isalfa   moveq   #-1,d0      ;upper case
  58.         rts
  59. maybealfa  cmpi.b  #'a',d1
  60.         blt.s   notalfa
  61.         cmpi.b  #'z',d1
  62.         blt.s   isalfa          ;lower case
  63. notalfa  moveq   #0,d0
  64.         rts
  65.  
  66.         XDEF    _isdigit
  67. _isdigit
  68.         move.w  4(sp),d0
  69. isdig_  cmp.b   #'0',d0
  70.         blt.s   1$
  71.         cmp.b   #'9',d0
  72.         bgt.s   1$
  73.         moveq   #-1,d0
  74.         rts
  75. 1$
  76.         moveq   #0,d0
  77.         rts
  78.  
  79.         XDEF    _isspace
  80. _isspace
  81.         move.w  4(sp),d0
  82.         cmpi.b   #' ',d0
  83.         beq.s   1$
  84.         cmpi.b   #10,d0
  85.         beq.s   1$
  86.         cmpi.b   #13,d0
  87.         beq.s   1$
  88.         cmpi.b   #9,d0
  89.         beq.s   1$
  90.         cmpi.b   #12,d0
  91.         beq.s   1$
  92.         moveq   #0,d0
  93.         rts
  94. 1$
  95.         moveq     #-1,d0
  96.         rts
  97.  
  98.         XDEF    _toupper
  99. _toupper
  100.         move.w  4(sp),d0
  101. toup_   cmpi.b   #'a',d0
  102.         blt.s   1$
  103.         cmpi.b   #'z',d0
  104.         bgt.s   1$
  105.         and.b   #%11011111,d0
  106. 1$      rts
  107.  
  108.         XDEF    _tolower
  109. _tolower
  110.         move.w  4(sp),d0
  111. tolo_   cmp.b   #'A',d0
  112.         blt.s   1$
  113.         cmp.b   #'Z',d0
  114.         bgt.s   1$
  115.         or.b    #%00100000,d0
  116. 1$      rts
  117.  
  118.         XDEF    _streq
  119. _streq:
  120.         movem.l  4(sp),a0/a1
  121. 1$:
  122.         cmpm.b   (a0)+,(a1)+
  123.         bne.s   2$
  124.         tst.b    -1(a1)
  125.         bne     1$
  126.         moveq   #-1,d0
  127.         rts
  128. 2$:
  129.         moveq   #0,d0
  130.         rts
  131.  
  132.           XDEF  _strieq
  133. _strieq   movem.l  4(sp),a0/a1
  134.           bra.s    instrieq
  135. ieqloop   tst.b    -1(a0)
  136.           beq.s    ieqtrue
  137. instrieq  move.b   (a0)+,d0
  138.           move.b   (a1)+,d1
  139.           sub.b    d0,d1
  140.           beq.s    ieqloop
  141.           cmpi.b   #32,d1
  142.           beq.s    ieqpos32
  143.           cmpi.b   #-32,d1
  144.           beq.s    ieqneg32
  145. ieqfalse  moveq    #0,d0
  146.           rts
  147. ieqpos32  cmpi.b   #'A',d0
  148.           blt.s    ieqfalse
  149.           cmpi.b   #'Z',d0
  150.           bgt.s    ieqfalse
  151.           bra.s    ieqloop
  152. ieqneg32  cmpi.b   #'a',d0
  153.           blt.s    ieqfalse
  154.           cmpi.b   #'z',d0
  155.           bgt.s    ieqfalse
  156.           bra.s    ieqloop
  157. ieqtrue   moveq    #-1,d0
  158.           rts
  159.  
  160.         XDEF    _strneq
  161. _strneq:
  162.         movem.l  6(sp),a0/a1
  163.         move.w  4(sp),d1
  164.         subq.w  #1,d1
  165. 1$:
  166.         cmpm.b  (a0)+,(a1)+
  167.         bne.s   2$
  168.         tst.b   -1(a1)
  169.         dbeq     d1,1$
  170. 3$      moveq   #-1,d0
  171.         rts
  172. 2$:
  173.         moveq   #0,d0
  174.         rts
  175.  
  176.           XDEF  _strnieq
  177. _strnieq  movem.l  6(sp),a0/a1
  178.           bra.s    instrnieq
  179. nieqloop   tst.b    -1(a0)
  180.           beq.s    nieqtrue
  181.           subq.w   #1,4(sp)
  182.           beq.s    nieqtrue
  183. instrnieq  move.b   (a0)+,d0
  184.           move.b   (a1)+,d1
  185.           sub.b    d0,d1
  186.           beq.s    nieqloop
  187.           cmpi.b   #32,d1
  188.           beq.s    nieqpos32
  189.           cmpi.b   #-32,d1
  190.           beq.s    nieqneg32
  191. nieqfalse  moveq    #0,d0
  192.           rts
  193. nieqpos32  cmpi.b   #'A',d0
  194.           blt.s    nieqfalse
  195.           cmpi.b   #'Z',d0
  196.           bgt.s    nieqfalse
  197.           bra.s    nieqloop
  198. nieqneg32  cmpi.b   #'a',d0
  199.           blt.s    nieqfalse
  200.           cmpi.b   #'z',d0
  201.           bgt.s    nieqfalse
  202.           bra.s    nieqloop
  203. nieqtrue  moveq    #-1,d0
  204.           rts
  205.  
  206.         XDEF    _strcmp
  207. _strcmp:
  208.         movem.l  4(sp),a0/a1
  209. 1$:
  210.         cmpm.b   (a0)+,(a1)+
  211.         bne.s   2$
  212.         tst.b   -1(a0)
  213.         bne.s   1$
  214. 2$      move.b  -1(a1),d0
  215.         sub.b   -1(a0),d0
  216.         ext.w   d0
  217.         ext.l   d0
  218.         rts
  219.  
  220.         XDEF    _stricmp
  221. _stricmp   movem.l  4(sp),a0/a1
  222.           bra.s    instricmp
  223. icmploop   tst.b    -1(a0)
  224.           beq.s    icmptrue
  225. instricmp  move.b   (a1)+,d0
  226.           move.b   (a0)+,d1
  227.           sub.b    d0,d1
  228.           beq.s    icmploop
  229.           cmpi.b   #32,d1
  230.           beq.s    icmppos32
  231.           cmpi.b   #-32,d1
  232.           beq.s    icmpneg32
  233. icmpfalse  cmpi.b  #'a',d0
  234.           blt.s    notlower1
  235.           cmpi.b   #'z',d0
  236.           bgt.s    notlower1
  237.           andi.b   #%11011111,d0
  238. notlower1 move.b   -1(a0),d1
  239.           cmpi.b   #'a',d1
  240.           blt.s    notlower2
  241.           cmpi.b   #'z',d1
  242.           bgt.s    notlower2
  243.           andi.b   #%11011111,d1
  244. notlower2 sub.b    d1,d0
  245.           ext.w    d0
  246.           ext.l    d0
  247.           rts
  248. icmppos32  cmpi.b   #'A',d0
  249.           blt.s    icmpfalse
  250.           cmpi.b   #'Z',d0
  251.           bgt.s    icmpfalse
  252.           bra.s    icmploop
  253. icmpneg32  cmpi.b   #'a',d0
  254.           blt.s    icmpfalse
  255.           cmpi.b   #'z',d0
  256.           bgt.s    icmpfalse
  257.           bra.s    icmploop
  258. icmptrue   moveq    #0,d0
  259.           rts
  260.  
  261.  
  262.         XDEF    _strncmp
  263. _strncmp:
  264.         movem.l  6(sp),a0/a1
  265.         move.w  4(sp),d1
  266.         subq.w  #1,d1
  267. 1$:
  268.         cmpm.b  (a0)+,(a1)+
  269.         bne.s   2$
  270.         tst.b   -1(a0)
  271.         dbeq    d1,1$
  272.         moveq   #0,d0
  273.         rts
  274. 2$      move.b  -1(a1),d0
  275.         sub.b   -1(a0),d0
  276.         ext.w   d0
  277.         ext.l   d0
  278.         rts
  279.  
  280.         XDEF    _strnicmp
  281. _strnicmp:
  282.           movem.l  6(sp),a0/a1
  283.           bra.s    instrnicmp
  284. nicmploop   tst.b    -1(a0)
  285.           beq.s    nicmptrue
  286.           subq.w   #1,4(sp)
  287.           beq.s    nicmptrue
  288. instrnicmp  move.b   (a1)+,d0
  289.           move.b   (a0)+,d1
  290.           sub.b    d0,d1
  291.           beq.s    nicmploop
  292.           cmpi.b   #32,d1
  293.           beq.s    nicmppos32
  294.           cmpi.b   #-32,d1
  295.           beq.s    nicmpneg32
  296. nicmpfalse  cmpi.b  #'a',d0
  297.           blt.s    nnotlower1
  298.           cmpi.b   #'z',d0
  299.           bgt.s    nnotlower1
  300.           andi.b   #%11011111,d0
  301. nnotlower1 move.b   -1(a0),d1
  302.           cmpi.b   #'a',d1
  303.           blt.s    nnotlower2
  304.           cmpi.b   #'z',d1
  305.           bgt.s    nnotlower2
  306.           andi.b   #%11011111,d1
  307. nnotlower2 sub.b    d1,d0
  308.           ext.w    d0
  309.           ext.l    d0
  310.           rts
  311. nicmppos32  cmpi.b   #'A',d0
  312.           blt.s    nicmpfalse
  313.           cmpi.b   #'Z',d0
  314.           bgt.s    nicmpfalse
  315.           bra.s    nicmploop
  316. nicmpneg32  cmpi.b   #'a',d0
  317.           blt.s    nicmpfalse
  318.           cmpi.b   #'z',d0
  319.           bgt.s    nicmpfalse
  320.           bra.s    nicmploop
  321. nicmptrue   moveq    #0,d0
  322.           rts
  323.  
  324.         XDEF    _strlen
  325. _strlen:
  326.          move.l  4(sp),a0
  327.          moveq   #-1,d0
  328. _in_strlen
  329.          tst.b   (a0)+
  330.          dbeq    d0,_in_strlen
  331.          not.l   d0
  332.          rts
  333.  
  334.         XDEF    _strcpy
  335. _strcpy
  336.         movem.l  4(sp),a0/a1
  337. 1$
  338.         move.b  (a0)+,(a1)+
  339.         bne     1$
  340.         rts
  341.  
  342.         XDEF    _strncpy
  343. _strncpy
  344.         movem.l  6(sp),a0/a1
  345.         move.w  4(sp),d1
  346.         subq.w  #1,d1
  347. 1$
  348.         move.b  (a0)+,(a1)+
  349.         dbeq    d1,1$
  350.         beq.s   2$
  351.         move.b  #0,(a1)
  352. 2$      rts
  353.  
  354.         XDEF    _strcat
  355. _strcat
  356.         movem.l  4(sp),a0/a1
  357. 1$      move.b  (a1)+,d0
  358.         bne     1$
  359.         subq.l  #1,a1
  360. 2$
  361.         move.b  (a0)+,(a1)+
  362.         bne     2$
  363.         rts
  364.  
  365.         XDEF    _strncat
  366. _strncat
  367.         movem.l  6(sp),a0/a1
  368.         move.w  4(sp),d1
  369.         subq.w  #1,d1
  370. 1$      tst.b   (a1)+
  371.         bne     1$
  372.         subq.l  #1,a1
  373. 2$
  374.         move.b  (a0)+,(a1)+
  375.         dbeq    d1,2$
  376.         beq.s   3$
  377.         move.b  #0,(a1)
  378. 3$      rts
  379.  
  380.         XDEF    _strpos
  381. _strpos
  382.         movea.l 6(sp),a0
  383.         move.w  4(sp),d1
  384.         moveq   #-1,d0
  385. 1$      tst.b   (a0)
  386.         beq.s   2$
  387.         cmp.b   (a0)+,d1
  388.         dbeq    d0,1$
  389.         not.l   d0
  390.         rts
  391. 2$      moveq  #-1,d0
  392.         rts
  393.  
  394.  
  395.         XDEF    _strrpos
  396. _strrpos
  397.         movea.l 6(sp),a0
  398.         move.w  4(sp),d1
  399.         moveq   #-1,d0
  400. 1$      tst.b   (a0)+
  401.         dbeq    d0,1$
  402.         not.l   d0
  403. 2$      cmp.b   -(a0),d1
  404.         dbeq    d0,2$
  405.         ext.l   d0
  406.         rts
  407.  
  408.         XDEF    _Hash
  409. _Hash
  410.         move.l  4(sp),-(sp)
  411.         bsr     _strlen
  412.         addq.w  #4,sp
  413.         move.l  4(sp),a0
  414.         moveq   #0,d1
  415. 1$
  416.         move.b  (a0)+,d1
  417.         beq.s   3$
  418.         cmp.b   #'a',d1
  419.         blt.s   2$
  420.         cmp.b   #'z',d1
  421.         bgt.s   2$
  422.         and.b   #%11011111,d1
  423. 2$      mulu    #13,d0
  424.         add.w   d1,d0
  425.         and.w   #$07ff,d0
  426.         bra     1$
  427. 3$      rts
  428.  
  429.         XDEF    _AllocString
  430. _AllocString:
  431.         move.l  4(sp),d0
  432.         jsr     _p%new
  433.         rts
  434.  
  435.         XDEF    _FreeString
  436. _FreeString:
  437.         move.l  4(sp),d0
  438.         jsr     _p%dispose
  439.         rts
  440.  
  441.         XDEF    _strdup
  442. _strdup
  443.          move.l  4(sp),a0
  444.          moveq   #-1,d0
  445. _in_strdup
  446.          tst.b   (a0)+
  447.          dbeq    d0,_in_strdup
  448.          not.l   d0
  449.         addq.l  #1,d0           ; add one for null byte
  450.         jsr     _p%new          ; try to allocate
  451.         beq.s   2$              ; if it failed, continue
  452.         move.l  d0,a1           ; get new mem address
  453.         move.l  4(sp),a0        ; and old string address
  454. 1$
  455.         move.b  (a0)+,(a1)+     ;added
  456.         bne     1$              ; if not finished, loop
  457. 2$      rts                     ; return
  458.  
  459.         END
  460.